/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.railway.app;

import com.railway.utils.QRDecoderPanel;
import com.railway.utils.RestServer;
import com.railway.utils.Toast;
import java.awt.Graphics;
import java.awt.Image;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.Hours;
import org.joda.time.Period;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 *
 * @author Kenny
 */
public class TicketCancelPanel extends javax.swing.JPanel {

    Image imgArrow = new ImageIcon(this.getClass().getResource("/com/railway/image/arrow.png")).getImage();
    private QRDecoderPanel decoder = null;
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date today = new Date();
    Date temp;
    Date ticketDate;
    int dialogButton;
    private String referenceNo, departureDate, departure, origin, destination, statuses;
    private double fare, claimFare, updateTicketFare;
    String temptodayTime;
    DateTime todayTime;
    String startDate, stopDate, tempStartDate, remaining;
    int hours, days;
    Date d1 = null;
    Date d2 = null;

    public TicketCancelPanel() {
        initComponents();
    }

    private void checkItemCode(String refNo) {
        jbtCancel.setEnabled(false);
        this.setLabel(null, null, null, null, null, null, null, null);
        String result = RestServer.httpGet("ticketCancelDetails", refNo);
        try {
            JSONObject json = new JSONObject(result);
            JSONObject content = json.getJSONObject("content");

            boolean error = json.optBoolean("error");
            if (!error) {
                int statuscode = json.getInt("status");
                tempStartDate = content.getString("departureDate") + " " + content.getString("departure");
                System.out.println(tempStartDate);
                temp = format.parse(tempStartDate);
                startDate = dateFormat.format(temp);
                stopDate = dateFormat.format(today);

                System.out.println(startDate + "\n" + stopDate);
                d1 = dateFormat.parse(startDate);
                d2 = dateFormat.parse(stopDate);

                DateTime dt1 = new DateTime(d1);
                DateTime dt2 = new DateTime(d2);

                System.out.print(Days.daysBetween(dt2, dt1).getDays() + " days, ");
                System.out.print(Hours.hoursBetween(dt2, dt1).getHours() % 24 + " hours, ");

                hours = Hours.hoursBetween(dt2, dt1).getHours() % 24;
                days = Days.daysBetween(dt2, dt1).getDays();
                remaining = "" + Days.daysBetween(dt2, dt1).getDays() + "days, " + Hours.hoursBetween(dt2, dt1).getHours() % 24 + " hours";
                referenceNo = content.getString("referenceNo");
                departureDate = content.getString("departureDate");
                departure = content.getString("departure");
                origin = content.getString("origin");
                destination = content.getString("destination");
                statuses = content.getString("status");
                fare = content.getDouble("fare");

                if (statuscode == 200) {
                    if (statuses.equals("CCL")) {
                        Toast.makeText(getParent(), "Ticket has already cancel before", Toast.LENGTH_LONG).display();
                        this.setLabel(referenceNo, origin, destination, statuses, departureDate, departure, "" + fare, "Not available");
                    } else {
                        jlblReferenceNo.setText(referenceNo);
                        if (days == 0 && hours < 24) {
                            Toast.makeText(getParent(), "<html>There's still " + hours + " left before the train departure <br />Unable to refund/cancel ticket</html>", Toast.LENGTH_LONG).display();
                            this.setLabel(referenceNo, origin, destination, statuses, departureDate, departure, "" + fare, "" + claimFare);
                        } else if (days >= 1 && days < 2) {
                            claimFare = fare * 0.25;
                            updateTicketFare = fare * 0.75;
                            jbtCancel.setEnabled(true);
                            Toast.makeText(getParent(), "<html>Refund 25% of the ticket price<br />There's still " + remaining + " left before the train departure", Toast.LENGTH_LONG).display();
                            this.setLabel(referenceNo, origin, destination, statuses, departureDate, departure, "" + fare, "" + claimFare);
                        } else if (days >= 2 && days < 3) {
                            claimFare = fare * 0.5;
                            updateTicketFare = fare * 0.5;
                            jbtCancel.setEnabled(true);
                            this.setLabel(referenceNo, origin, destination, statuses, departureDate, departure, "" + fare, "" + claimFare);
                            Toast.makeText(getParent(), "<html>Refund 50% of the ticket price<br />There's still " + remaining + " left before the train departure", Toast.LENGTH_LONG).display();
                        } else if (days >= 3) {
                            claimFare = fare * 0.75;
                            updateTicketFare = fare * 0.25;
                            jbtCancel.setEnabled(true);
                            this.setLabel(referenceNo, origin, destination, statuses, departureDate, departure, "" + fare, "" + claimFare);
                            Toast.makeText(getParent(), "<html>Refund 75% of the ticket price<br />There's still " + remaining + " left before the train departure", Toast.LENGTH_LONG).display();
                        }
                    }
                } else {
                    Toast.makeText(getParent(), "Invalid QR Ticket or QR Ticket has expire", Toast.LENGTH_LONG).display();
                }
            } else {
                Toast.makeText(getParent(), "Invalid QR Ticket or QR Ticket has expire", Toast.LENGTH_LONG).display();
            }
        } catch (JSONException ex) {
            Toast.makeText(getParent(), "Invalid QR Ticket or QR Ticket has expire", Toast.LENGTH_LONG).display();
            jlblReferenceNo.setText("-");
            System.out.println(ex);
        } catch (ParseException ex) {
            System.out.println(ex);
            Toast.makeText(getParent(), "" + ex, Toast.LENGTH_LONG).display();
            jlblReferenceNo.setText("-");
        }
    }

    private void setLabel(String refNo, String origin, String destination, String status, String departDate, String departTime, String ticketPrice, String returnPrice) {
        jlblRefNo.setText(refNo);
        jlblOrigin.setText(origin);
        jlblDestination.setText(destination);
        jlblStatus.setText(status);
        jlblDepartureDate.setText(departDate);
        jlblDepartureTime.setText(departTime);
        jlblTicketPrice.setText(ticketPrice);
        jlblReturnPrice.setText(returnPrice);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jpSchedule = new javax.swing.JPanel();
        jPanel2 = new javax.swing.JPanel();
        jlblTicketReferenceNo = new javax.swing.JLabel();
        jlblReferenceNo = new javax.swing.JLabel();
        jButton2 = new javax.swing.JButton();
        jpScanner = new javax.swing.JPanel();
        jPanel1 = new javax.swing.JPanel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        jbtCancel = new javax.swing.JButton();
        jlblRefNo = new javax.swing.JLabel();
        jlblOrigin = new javax.swing.JLabel();
        jlblDestination = new javax.swing.JLabel();
        jlblStatus = new javax.swing.JLabel();
        jlblDepartureDate = new javax.swing.JLabel();
        jlblDepartureTime = new javax.swing.JLabel();
        jlblTicketPrice = new javax.swing.JLabel();
        jlblReturnPrice = new javax.swing.JLabel();
        jpScheduleArrow = new javax.swing.JPanel(){
            protected void paintComponent(Graphics g){
                super.paintComponent(g);
                g.drawImage(imgArrow, 0, 0, getWidth(), getHeight(), this);
            }
        };

        setPreferredSize(new java.awt.Dimension(870, 460));
        setLayout(null);

        jpSchedule.setBackground(new java.awt.Color(220, 220, 220));
        jpSchedule.setLayout(null);

        jlblTicketReferenceNo.setText("Ticket Reference No");

        jlblReferenceNo.setText("                                ");

        jButton2.setText("Scan");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jlblTicketReferenceNo, javax.swing.GroupLayout.PREFERRED_SIZE, 113, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(29, 29, 29)
                .addComponent(jlblReferenceNo, javax.swing.GroupLayout.PREFERRED_SIZE, 107, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(98, Short.MAX_VALUE))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jlblTicketReferenceNo)
                    .addComponent(jlblReferenceNo)
                    .addComponent(jButton2))
                .addContainerGap(66, Short.MAX_VALUE))
        );

        jpSchedule.add(jPanel2);
        jPanel2.setBounds(30, 40, 440, 100);

        jpScanner.setBorder(javax.swing.BorderFactory.createMatteBorder(1, 1, 1, 1, new java.awt.Color(255, 0, 0)));

        javax.swing.GroupLayout jpScannerLayout = new javax.swing.GroupLayout(jpScanner);
        jpScanner.setLayout(jpScannerLayout);
        jpScannerLayout.setHorizontalGroup(
            jpScannerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 298, Short.MAX_VALUE)
        );
        jpScannerLayout.setVerticalGroup(
            jpScannerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 228, Short.MAX_VALUE)
        );

        jpSchedule.add(jpScanner);
        jpScanner.setBounds(500, 110, 300, 230);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Ticket Details"));

        jLabel2.setText("Ticket Reference No");

        jLabel3.setText("Origin");

        jLabel4.setText("Destination");

        jLabel5.setText("Status");

        jLabel6.setText("Departure Date");

        jLabel7.setText("Departure Time");

        jLabel8.setText("Ticket Price");

        jLabel9.setText("Return Price");

        jbtCancel.setText("Confirm");
        jbtCancel.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtCancelActionPerformed(evt);
            }
        });

        jlblRefNo.setText("-");

        jlblOrigin.setText("-");

        jlblDestination.setText("-");

        jlblStatus.setText("-");

        jlblDepartureDate.setText("-");

        jlblDepartureTime.setText("-");

        jlblTicketPrice.setText("-");

        jlblReturnPrice.setText("-");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel8, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel9, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jlblReturnPrice, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jlblRefNo, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jlblOrigin, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jlblDestination, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jlblStatus, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jlblDepartureDate, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jlblDepartureTime, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jlblTicketPrice, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addComponent(jbtCancel)
                .addContainerGap(56, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(jlblRefNo))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(jlblOrigin))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel4)
                    .addComponent(jlblDestination))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel5)
                    .addComponent(jlblStatus))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel6)
                    .addComponent(jlblDepartureDate))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel7)
                    .addComponent(jlblDepartureTime))
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel8)
                            .addComponent(jlblTicketPrice))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel9)
                            .addComponent(jlblReturnPrice))
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 29, Short.MAX_VALUE)
                        .addComponent(jbtCancel)
                        .addGap(35, 35, 35))))
        );

        jpSchedule.add(jPanel1);
        jPanel1.setBounds(30, 160, 440, 260);

        add(jpSchedule);
        jpSchedule.setBounds(0, 20, 870, 440);

        javax.swing.GroupLayout jpScheduleArrowLayout = new javax.swing.GroupLayout(jpScheduleArrow);
        jpScheduleArrow.setLayout(jpScheduleArrowLayout);
        jpScheduleArrowLayout.setHorizontalGroup(
            jpScheduleArrowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 150, Short.MAX_VALUE)
        );
        jpScheduleArrowLayout.setVerticalGroup(
            jpScheduleArrowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 20, Short.MAX_VALUE)
        );

        add(jpScheduleArrow);
        jpScheduleArrow.setBounds(360, 0, 150, 20);
    }// </editor-fold>//GEN-END:initComponents

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
        this.setLabel(null, null, null, null, null, null, null, null);
        jpScanner.setVisible(true);

        if (decoder != null) {
            decoder.closeWebCam();
        }

        decoder = new QRDecoderPanel();
        jpScanner.add(decoder);
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    if (decoder.isClosed()) {
                        if (!decoder.getDecodedID().equals("")) {
                            checkItemCode(decoder.getDecodedID());
                            jpScanner.setVisible(false);
                        }
                        break;
                    }
                }
            }
        }).start();
    }//GEN-LAST:event_jButton2ActionPerformed

    private void jbtCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtCancelActionPerformed
        dialogButton = JOptionPane.showConfirmDialog(null, "Please proceed cancel the ticket after click OK button", "WARNING", JOptionPane.YES_NO_OPTION);
        if (dialogButton == JOptionPane.YES_OPTION) {

            Map<String, Object> dataRefundLog = new HashMap<>();
            dataRefundLog.put("amount", claimFare);
            dataRefundLog.put("referenceNo", this.referenceNo);

            Map<String, Object> dataCancelTicket = new HashMap<>();
            dataCancelTicket.put("referenceNo", this.referenceNo);
            dataCancelTicket.put("status", "CCL");
            dataCancelTicket.put("fare", "" + this.updateTicketFare);

            Map<String, Object> dataCancelBookedSeat = new HashMap<>();
            dataCancelBookedSeat.put("referenceNo", this.referenceNo);
            dataCancelBookedSeat.put("status", "CCL");


            String refund = RestServer.httpPost("insertRefundLog", dataRefundLog);
            System.out.println(refund);
            String cancelTicket = RestServer.httpPost("cancelUpdateTicket", dataCancelTicket);
            System.out.println(cancelTicket);
            String cancelBookedSeat = RestServer.httpPost("cancelBookedSeat", dataCancelBookedSeat);
            System.out.println(cancelBookedSeat);
            try {
                JSONObject jsonRefund = new JSONObject(refund);
                JSONObject jsonCancelTicket = new JSONObject(cancelTicket);
                JSONObject jsonCancelBookedSeat = new JSONObject(cancelBookedSeat);
                int statusRefund = jsonRefund.getInt("status");
                int statusTicket = jsonCancelTicket.getInt("status");
                int statusBookedSeat = jsonCancelBookedSeat.getInt("status");
                System.out.println(statusBookedSeat);
                if (statusRefund == 200 && statusBookedSeat == 200 || statusTicket == 200) {
                    Toast.makeText(getParent(), "Ticket is successfully cancelled", Toast.LENGTH_LONG).display();
                } else {
                    Toast.makeText(getParent(), "Unable to process the ticket", Toast.LENGTH_LONG).display();
                }
            } catch (JSONException ex) {
                System.out.println(ex);
            }

        }
    }//GEN-LAST:event_jbtCancelActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JButton jbtCancel;
    private javax.swing.JLabel jlblDepartureDate;
    private javax.swing.JLabel jlblDepartureTime;
    private javax.swing.JLabel jlblDestination;
    private javax.swing.JLabel jlblOrigin;
    private javax.swing.JLabel jlblRefNo;
    private javax.swing.JLabel jlblReferenceNo;
    private javax.swing.JLabel jlblReturnPrice;
    private javax.swing.JLabel jlblStatus;
    private javax.swing.JLabel jlblTicketPrice;
    private javax.swing.JLabel jlblTicketReferenceNo;
    private javax.swing.JPanel jpScanner;
    private javax.swing.JPanel jpSchedule;
    private javax.swing.JPanel jpScheduleArrow;
    // End of variables declaration//GEN-END:variables
}
